package com.lanhao.aot.weeklyreport;

import java.io.File;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.ui.freemarker.FreeMarkerConfigurationFactory;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.sun.mail.util.MailSSLSocketFactory;

import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;
import freemarker.template.Template;

public class WeeklyReportUtil {
	
	public static void main(String[] args) {
		doWeeklyReportSend();
	}
	
	public static void doWeeklyReportSend() {
		HashMap<String, Object> dataMap = Maps.newHashMap();
		String mailSubject = "中移APP灵犀助理研测周报";
		// 获取当前所在周的第一天和最后一天
		Pair<String, String> currentWeek = getCurrentWeek();
		String timeRangeStart = currentWeek.getLeft();
		String timeRangeEnd = currentWeek.getRight();
		dataMap.put("mailSubject", mailSubject);
		dataMap.put("timeRangeStart", timeRangeStart);
		dataMap.put("timeRangeEnd", timeRangeEnd);
		
		// 本周任务
		Map<String, List<String>> currentWorkMap = Maps.newLinkedHashMap();
		currentWorkMap.put("研发任务", Lists.newArrayList (
				"完成充值意图2.0支持多轮版本改造与发布上线",
				"完成灵犀新人有礼活动的研发、测试准出与发布上线",
				"完成灵犀助理宽带直办需求研发与联调，已发布灰度，等待准出后上线",
				"启动商机挖掘V3版本需求功能研发，总体进展50%",
				"完成日常省份意图与知识导入配置与发布上线",
				"完成投诉建单智能体二期需求提测，等待准出后发布",
				"完成灵策精准推荐接口接入号卡推荐提测，准出验证中",
				"完成知识库接口统一切换功能研发，等待联调完成后提测",
				"完成流量质疑智能体新版本模型v38版本集成测试，仍存在效果问题，持续优化中",
				"持续进行灵运平台分省平台问题定位与修复"
		));
		currentWorkMap.put("测试任务", Lists.newArrayList(
				"完成业务侧日常上线的测试验证及上线发布",
				"配合客户进行流量质疑智能体v38版本的效果验证，问题已反馈算法侧排查优化",
				"完成MCP技术调研与demo开发",
				"配合业务部进行算法测试招聘",
				"推动产品、研发、测试在E3的需求管理"
		));

		currentWorkMap.put("运维任务", Lists.newArrayList(
				"持续进行线上运营数据至线下数据库的数据导出与同步工作",
				"完成新版本智能体v38版本的申请与部署",
				"完成测试环境Harbor仓库不可用问题修复",
				"配合日常业务侧的运维数据操作，包括数据库、缓存及服务运维操作",
				"完成现网Mysql与Redis服务器的磁盘告警处理",
				"配合灵犀APP日常业务的上线发布运维操作"
		));
		dataMap.put("currentWorkMap", currentWorkMap);
		
		// 问题清单
		List<String> problemList = Lists.newArrayList();
		dataMap.put("problemList", problemList);
		
		// 下周计划
		Map<String, List<String>> nextWorkMap = Maps.newLinkedHashMap();
		nextWorkMap.put("研发任务", Lists.newArrayList(
				"完成投诉建单智能体二期需求提测与上线发布",
				"完成客服大模型V2.0 点击FAQ后走回原在线客服回复的逻辑优化与上线",
				"启动客服大模型V3.0命中意图但未取到回复的情况走FAQ逻辑优化，完成研发与内部测试验证",
				"完成客服大模型V4.0讯飞命中TASK后后续流程能串联功能研发，并提测",
				"完成知识库统一接口切换联调，配合完成准出测试与上线发布",
				"完成一语直达对接知识库实现业务介绍需求改造，完成提测并配合准出测试",
				"配合客户完成宽带直办需求测试准出，并发布上线",
				"启动广东号卡场景新增‘换一个’气泡功能研发，完成研发并提测",
				"配合客户侧完成车主权益-充电意图下线处理与上线发布",
				"完成在线营销助手-商机挖掘工具 v1.1优化需求，并发布上线",
				"完成一语直达知识库反补场景研发，启动内部测试验证",
				"完成山东省公司灵犀合伙人商机流程研发，完成自测，具备内部测试条件",
				"完成每周省份新增意图的配置与发布上线",
				"持续进行流量质疑智能体的效果优化及测试验证，完成新版本智能体发布上线",
				"持续进行灵运平台及灵犀融合版的问题排查定位"
		));
		nextWorkMap.put("测试任务", Lists.newArrayList(
				"持续进行业务侧上线需求的测试验证与发布验证",
				"持续进行流程质疑智能体模型新版本测试验证，并梳理badcase反馈至研究院",
				"持续推动E3平台在项目内的宣贯使用及需求跟踪",
				"对标客户侧意图识别语料，推动算法侧完成意图识别模型的更新",
				"完成组内MCP协议的相关功能演示"
		));
		nextWorkMap.put("运维任务", Lists.newArrayList(
				"配合算法侧完成新版本模型的部署验证",
				"日常配合业务侧完成业务服务的上线发布",
				"跟进客户侧完成Mysql与Redis服务器的磁盘扩容申请"
		));
		dataMap.put("nextWorkMap", nextWorkMap);
		
		// 诉求
		List<String> appealList = Lists.newArrayList(
			"同上周（已持续3周无可用版本）：需研究院尽快输出可用的智能体SOP相关能力的训练版本",
			"同上周（已持续3周无可用版本）：需研究院尽快完成基于智能体实现的意图维持及退出功能"
		);
		dataMap.put("appealList", appealList);
		
		// 发送列表
		List<String> tosList = Lists.newArrayList("zhenli24@iflytek.com", "qljiang6@iflytek.com",
				"leizhang107@iflytek.com", "bbni@iflytek.com", "weichen58@iflytek.com", "bingdai2@iflytek.com", "kunzhou3@iflytek.com", "chaohuang2@iflytek.com",
				"xyzhang111@iflytek.com", "jieniu3@iflytek.com", "zhewang20@iflytek.com", "weishen5@iflytek.com", "xlcai3@iflytek.com, yuewang33@iflytek.com, kunzhou3@iflytek.com");
		List<String> ccsList = Lists.newArrayList("qiwang27@iflytek.com", "fuzhang2@iflytek.com" ,"kunliu16@iflytek.com", "ffyang5@iflytek.com", "alfan@iflytek.com" );
		
//		List<String> tosList = Lists.newArrayList("kunzhou3@iflytek.com");
//		List<String> ccsList = Lists.newArrayList("kunzhou3@iflytek.com");
		try {
			
			MailAccount account = new MailAccount();
			account.setHost("mail.iflytek.com");
			account.setPort(465);
			account.setAuth(true);
			account.setFrom("kunzhou3@iflytek.com");
			account.setUser("kunzhou3@iflytek.com");
			account.setPass("m9v7RxdVerVcI3W3");
			
			account.setSslEnable(true);
			
			MailSSLSocketFactory sf = new MailSSLSocketFactory();
			sf.setTrustAllHosts(true);
			account.setCustomProperty("mail.smtp.ssl.socketFactory", sf);
			account.setConnectionTimeout(3000);
			account.setTimeout(3000);
			
			FreeMarkerConfigurer configurer = build();
			Template tpl = configurer.getConfiguration().getTemplate("weekly_report_email_template.ftl");
			// FreeMarker通过Map传递动态数据 解析模板并替换动态数据，最终content将替换模板文件中的${content}标签。
			String mailHtml = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, dataMap);
			FileUtils.writeStringToFile(new File("D:/1.txt"), mailHtml, "UTF-8");
			String messageId = MailUtil.send(account, tosList, ccsList, null, mailSubject, mailHtml, true);
			System.out.println("发送邮件，返回的信息messageId=" + messageId);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static FreeMarkerConfigurer build() {
		try {
			FreeMarkerConfigurationFactory factory = new FreeMarkerConfigurationFactory();
			factory.setTemplateLoaderPaths("classpath:tpl");
			factory.setDefaultEncoding("UTF-8");
			FreeMarkerConfigurer result = new FreeMarkerConfigurer();
			result.setConfiguration(factory.createConfiguration());
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	public static Pair<String, String> getCurrentWeek() {
		// 获取当前日期
        LocalDate currentDate = LocalDate.now();
        // 获取本周的第一天（周一）
        LocalDate startOfWeek = currentDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
        // 获取本周的最后一天（周日）
        LocalDate endOfWeek = currentDate.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
        // 定义日期格式化器
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        // 格式化日期为字符串
        String startOfWeekStr = startOfWeek.format(formatter);
        String endOfWeekStr = endOfWeek.format(formatter);
        return Pair.of(startOfWeekStr, endOfWeekStr);
	}
}
